package Day004.demo001_Object类;

import java.util.Objects;

public class Person/* extends Object*/ { //直接默认继承Object类

    String name;
    String sex;
    int age;

    public Person() {
    }

    public Person(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }
    //快捷键 Alt + Ins --> toString()
    //-------------------------------------------------

    //public boolean equals(Object obj){
    //    //指定比较规则
    //    Person p = (Person) obj; //向下转型 强转
    //    return name.equals(p.name);
    //}

    @Override
    public boolean equals(Object o) {
        //如果2个对象的地址值相同,返回true,结束方法
        if (this == o) return true;
        //如果传入的对象是null,返回false,结束方法
        //如果传入的对象不是null,并且两个对象的类型不相同,返回false,结束方法
        if (o == null || getClass() != o.getClass()) return false;
        //2个对象是相同类型(Person),并且地址值不一样
        Person person = (Person) o;
        //比较2个对象属性是否相同,相同返回true,不同返回false
        return age == person.age &&
                Objects.equals(name, person.name) &&
                Objects.equals(sex, person.sex);

        //return name.equals(person.name);
        //如果直接调用方法,如果p1为null  会空指针错误,因为null不能调用方法,而Objects类的方法会先进行条件判断

        /*Objects类:
        Objects类是Object类的工具类,该类定义了很多静态方法,可以直接使用类名访问,
                                  并且该类中的方法是空指针安全的
        源码:
        public static boolean equals(Object a, Object b) {
            如果传入的a,b对象地址相同,就直接返回true
            如果传入的a,b对象地址不同:
            如果传入的第一个对象a为null,name返回false
            如果传入的第一个对象a不为null,才去比较
            return (a == b) || (a != null && a.equals(b));
        }
        */
    }
}
